package com.alex.monitor.core.annotation;

import com.alex.monitor.core.enums.TriggerType;
import com.alex.monitor.core.rule.MonitorRule;
import com.alex.monitor.core.rule.impl.DefaultMonitorRule;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 监控方法
 *
 * @author Alex.Liu
 * @date: 2025-02-16 14:25
 * @since 1.0.0
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodMonitor {

    /**
     * 当方法抛出某种类型的异常时进行通知
     *
     * @return
     */
    TriggerType[] trigger() default {TriggerType.EXCEPTION};


    /**
     * 关注那些异常，在哪些异常时进行提醒
     *
     * @return
     * @see TriggerType#EXCEPTION
     */
    Class<? extends Throwable>[] exceptions() default {Exception.class};


    /**
     * 返回结果包含code  如响应码等
     *
     * @see TriggerType#RESULT
     */
    String code() default "";

    /**
     * 当返回结果不是基础数据类型时 ，会检测返回结果是否包含#code() 并且code 值等于 #result()； 进行提醒
     */
    String result() default "";

    /**
     * 允许多个方法进行分组 比如a 方法抛出，异常e b 方法同样抛出异常e 的时候 达到指次数后进行提醒
     *
     * @return
     */
    String groupId() default "";

    /**
     * 方法重载时需指定 <>优先级 #groupId > uniqueId</> 同时指定时 groupId 生效
     *
     * @return
     */
    String uniqueId() default "";

    /**
     * 触发规则
     *
     * @return
     */
    Class<? extends MonitorRule> rule() default DefaultMonitorRule.class;
}